Range-based `for` statement definition redundancy
Posted
by GMan - Save the Unicorns
on Stack Overflow
See other posts from Stack Overflow
or by GMan - Save the Unicorns
Published on 2010-04-15T20:49:45Z
Indexed on
2010/04/15
20:53 UTC
Read the original article
Hit count: 394
Looking at n3092, in §6.5.4 we find the equivalency for a range-based for loop. It then goes on to say what __begin
and __end
are equal to. It differentiates between arrays and other types, and I find this redundant (aka, confusing).
It says for arrays types that __begin
and __end
are what you expect: a pointer to the first and a pointer to one-past the end. Then for other types, __begin
and __end
are equal to begin(__range)
and end(__range)
, with ADL. Namespace std
is associated, in order to find the std::begin
and std::end
defined in <iterator>
, §24.6.5.
However, if we look at the definition of std::begin
and std::end
, they are both defined for arrays as well as container types. And the array versions do exactly the same as above: pointer to the first, pointer to one-past the end.
Why is there a need to differentiate arrays from other types, when the definition given for other types would work just as well, finding std::begin
and std::end
?
Some abridged quotes for convenience:
§24.6.5 The range-based for statement
— if _RangeT is an array type, begin-expr and end-expr are __range and __range + __bound, respectively, where __bound is the array bound. If _RangeT is an array of unknown size or an array of incomplete type, the program is ill-formed.— otherwise, begin-expr and end-expr are begin(_range) and end(_range), respectively, where begin and end are looked up with argument-dependent lookup (3.4.2). For the purposes of this name lookup, namespace std is an associated namespace.
and
§24.6.5 range access
template T* begin(T (&array)[N]);
Returns: array.
template T* end(T (&array)[N]);
Returns: array + N.
© Stack Overflow or respective owner